package collect

type Stack[T any] struct {
	top *node[T]
	len int
}

func (s *Stack[T]) Top() T {
	if s.top == nil {
		panic("栈为空")
	}

	return s.top.data
}

// Len 是返回栈的长度
func (s *Stack[T]) Len() int {
	return s.len
}

// Push 是往栈中放入一个元素
func (s *Stack[T]) Push(data T) {
	newNode := &node[T]{
		data: data,
	}
	defer func() {
		s.len++
	}()

	if s.top == nil {
		s.top = newNode
		return
	}

	newNode.next = s.top
	s.top = newNode
}

// Pop 是弹出栈的一个元素
func (s *Stack[T]) Pop() {
	if s.top == nil {
		panic("栈为空")
	}
	s.len--
	s.top = s.top.next
}
